/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package infoserver;

import Protocol.ClientObject;
import Protocol.ComProtocol;
import Protocol.ReturnObject;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

    /**
    * Deze klasse zorgt ervoor dat het maken en laden van backups mogelijk wordt..
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
public class BackupManagement extends JPanel {
    private File file;
    private String path;
    private Writer writer = null;
    private ComProtocol cp;
    private String result = "";
    private ArrayList<String> resultList;
    private int success = 0;
    private int successCounter;
    
    
    public BackupManagement(){
        createDir();
        
        setLayout(null);
        
        resultList = new ArrayList();
    }
    
    /**
    * indien geen backups folder bestaat, wordt deze aangemaakt.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public void createDir(){
        String location = System.getProperty("user.dir");
        String dirName = location + "\\backups";
        File directory = new File(dirName);
        if(!directory.exists()){
            directory.mkdir();
        }
        path = dirName;
    }
    
    /**
    * Haalt de elementen in de backups folder op.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public void refreshElements(){
    File aDirectory = new File(path);
    String[] filesInDir = aDirectory.list();
        for ( int i=0; i<filesInDir.length; i++ ){
            String file = filesInDir[i];
            int mid = file.lastIndexOf(".");
            String ext = file.substring(mid+1,file.length());
            if("back".equals(ext)){
                resultList.add(filesInDir[i]);
            }
        }
    }
    
    /**
    * Geeft het resultaat terug.
    * @author Roman Wiedijk
    * @since 03-06-2012
    */
    
    public ArrayList getResults(){
        return resultList;
    }
    
    /**
    * Maakt een nieuw bestand aan met de huidige datum en tijd en zet daar de aangemaakte insert query in.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    public void createBackup(String acceptedQuery){
        file = new File(path, getFileName());
        success = 0;
        if(!file.exists()){
            try{
                file.createNewFile();
                BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
                bw.write(acceptedQuery);
                bw.close();
                success = 1;
            }
            catch(IOException e){
                System.out.println(e.getMessage());
            }
        } else{
            System.out.println("File already exists");
        }
    }
    
    /**
    * Leest een bestand in en voert deze uit met behulp van de executeQuery() functie.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public int loadBackup(String file, Infoserver is){
        BufferedReader br = null;
        String line = "";
        String total = "";
        int firstLetter = 0;
        int lastLetter = 0;
        int lineNumber = 0;
        successCounter = 0;
        try {
            br = new BufferedReader(new FileReader(path + "\\" + file));
            while((line = br.readLine()) != null){
                total += line + "\n";
            }
            br.close();
        } catch (FileNotFoundException ex) {
            System.out.println("Bestand niet gevonden.");
        } catch (IOException ex){
            System.out.println("IO Exception");
        }
        
        executeQuery("DELETE FROM [User] WHERE Name != \'System\'", is);
        executeQuery("DELETE FROM [Query]", is);
        for(int i = 0;i<total.length();i++){
            if(total.substring(i, i+1).equals("\n")){
                lastLetter = i;
                if(lineNumber == 0){
                    String queryA = total.substring(firstLetter, lastLetter);
                    executeQuery(queryA, is);
                } if(lineNumber == 1) {
                    String queryB = total.substring(firstLetter, lastLetter);
                    executeQuery(queryB, is);
                }
                firstLetter = i+1;
                lineNumber++;
            }
        }
        return successCounter;
    }
    
    /**
    * Verstuurd een executeAuthUpdateQuery verzoek.
    * @author Roman Wiedijk
    * @since 03-06-2012
    */
    
    public void executeQuery(String query, Infoserver is){
        is.getSql().excecuteAuthUpdateQuery(query);
        successCounter++;
    }
    
    /**
    * Verwijderd het doorgestuurde bestand indien deze nog bestaat.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public int deleteBackup(String file){
        String selectedValue = "";
        int success = 0;
        boolean nullPointer = false;
        try {
            selectedValue = file; //leest de selectie van de gebruiker uit
        } catch (NullPointerException ex){
            nullPointer = true;
        }
        if(nullPointer == false){
            File selectedFile = new File(path, selectedValue); //Maakt een File object van het geselecteerde bestand
            if(selectedFile.exists()){ //kijtkt of het geselecteerde bestand bestaat, zo niet wordt er een foutmelding weergeven
                if(selectedFile.canWrite()){ //kijkt of er permissie is om het bestand te verwijderen, zo niet wordt er een foutmelding weergeven
                    selectedFile.delete();
                    success = 1;
                }
            }
        }
        return success;
    }
    
    /**
    * Haalt de huidige datum op.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public String getDate(){
        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        Date date = new Date();
        return dateFormat.format(date);
    }
    
    /**
    * Haalt het huidige uur op.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public String getHour(){
        DateFormat dateFormat = new SimpleDateFormat("HH");
        Date date = new Date();
        return dateFormat.format(date);
    }
    
    /**
    * Haalt het huidig aantal minuten op.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public String getMinute(){
        DateFormat dateFormat = new SimpleDateFormat("mm");
        Date date = new Date();
        return dateFormat.format(date);
    }
    
    /**
    * Haalt het huidig aantal seconden op.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public String getSecond(){
        DateFormat dateFormat = new SimpleDateFormat("ss");
        Date date = new Date();
        return dateFormat.format(date);
    }
    
    /**
    * Verwerkt de datumgegevens naar een String.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public String getFileName(){ //mag geen / bevatten dit zorgt voor errors, ook geen tekens die niet ondersteurnt worden door windows
        return "Backup " + getDate() + " " + getHour() + "u" + getMinute() + "m" + getSecond() + "s.back";
    }
    
    /**
    * Geeft de locatie van de backups folder terug.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public String getPath(){
        return path;
    }
    
    /**
    * Geeft weer of het uitvoeren succesvol is.
    * @author Roman Wiedijk
    * @since 01-06-2012
    */
    
    public int getSuccess(){
        return success;
    }
}
